#ifndef _URL_H
#define _URL_H

#include <iostream>
#include <string>
#include <string.h>
#include <stdlib.h>
#include "../aranya_base/type.h"
#include "../aranya_base/func.h"

////////////////////////////////////////////////////////////
/// 一类宏地定义，并非精确定义
/// URL长度最大值
#define MAX_URL_SIZE			1024
/// 主机域名长度最大值64
#define MAX_HOST_SIZE			64
/// 文件路径长度最大值
#define MAX_FILE_DIR_SIZE		(MAX_URL_SIZE - MAX_HOST_SIZE)
/// IP地址长度最大值16
#define MAX_IP_SIZE			16
/// HTTP默认端口
#define HTTP_PORT			80
/// FTP默认端口
#define FTP_PORT			21
/// 用户名长度最大值
#define MAX_USER_SIZE			16
/// 密码最大长度
#define MAX_PASSWD_SIZE			16
/// 端口最大值
#define MAX_PORT_VALUE			65536
/////////////////////////////////////////////////////////////

///8字节
typedef signed char				_int_8;
typedef unsigned char				_uint_8;

///16字节
typedef signed short int			_int_16;
typedef unsigned short int			_uint_16;

///32字节
typedef signed int				_int_32;
typedef unsigned int				_uint_32;

///64字节
typedef signed long long int			_int_64;
typedef unsigned long long int			_uint_64;

using namespace std;
using namespace aranya_type;

/// 主机类型定义
enum
{
	HOST_DOMAIN = 0,
	HOST_IP,
	HOST_ERROR
};

/// 协议类型定义
enum
{
	SCHEME_HTTP = 0,
	SCHEME_FTP,
	SCHEME_FILE,
	SCHEME_OTHER
};

/// 编码类型
enum
{
	URL_ENCODE_UTF8 = 0,
	URL_ENCODE_GB2312,
	URL_ENCODE_UNICODE,
	URL_ENCODE_UNKNOWN
};

class url
{
	private:
		/// 编码类型
		_uint_8 encode_type;
		/// 协议
		_uint_8 scheme;
		/// 主机名
		char host[MAX_HOST_SIZE];
		/// 端口号
		_uint_16 port;
		/// 文件路径
		char file[MAX_FILE_DIR_SIZE];
		/// 用户名
		char user[MAX_USER_SIZE];
		/// 密码
		char passwd[MAX_PASSWD_SIZE];

	public:
		/// 构造函数
		url()
			: encode_type(URL_ENCODE_UTF8), scheme(SCHEME_HTTP), port(HTTP_PORT)
		{
			bzero(host, sizeof(host));
			bzero(file, sizeof(file));
			bzero(user, sizeof(user));
			bzero(passwd, sizeof(passwd));
		}
		/// 析构函数
		~url() {}

		/// 得到url编码方式
		inline _uint_8 get_encode_type()
		{
			return this->encode_type;
		}
		
		/// 得到协议
		inline _uint_8 get_scheme()
		{
			return this->scheme;
		}

		/// 得到主机名
		inline char* get_host()
		{
			return this->host;
		}

		/// 得到端口号
		inline _uint_16 get_port()
		{
			return this->port;
		}

		/// 得到文件路径
		inline char* get_file()
		{
			return this->file;
		}

		/// 得到用户名
		inline char* get_user()
		{
			return this->user;
		}

		/// 得到密码
		inline char* get_passwd()
		{
			return this->passwd;
		}

		/// 处理协议(默认去掉协议头)
		bool parse_scheme(char *url, bool cut = true);

		/// 整理文件路径
		bool arrange_file();

		/// 解析url，分解成协议，用户名，密码，主机，端口，文件路径六个部分
		bool parse_url(char *url);

		/// url合法性
		bool is_valid();

		/// 返回主机类型(ip或域名)
		_uint_8 host_kind();

		/// 组成一个完整的url
		char* normalize_url();

		/// 清除url
		void clear_url();
};

#endif

